import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

# sns.set(style="white")
# plt.rcParams['font.sans-serif'] = "Simsun"  # 支持中文字体

# Excel文件路径
excel_file = 'D:\文档\DLMU\GRO实验结果.xlsx'

# 使用pandas读取Excel文件的 sheet5 数据
df = pd.read_excel(excel_file, sheet_name='Sheet5')

# 如果所有列名都为空，跳过该 sheet
if all(df.columns.isnull()):
    print("该 sheet 没有数据，跳过")
else:
    # 去除完全空的行
    df = df.dropna(how="all")

    # 如果"狮群"列存在，标记种群大小
    if "狮群" in df.columns:
        df["Population Size"] = df["狮群"].iloc[0]  # 使用第一个值作为种群大小

    # 获取唯一的种群大小列表
    population_sizes = df["Population Size"].unique()

    # 初始化绘图
    plt.figure(figsize=(12, 8))

    # 遍历每个种群大小并绘制到同一图上
    for pop_size in population_sizes:
        subset = df[df["Population Size"] == pop_size]  # 按种群大小筛选数据
        sns.lineplot(
            data=subset,
            x="迭代",  # x 轴：迭代次数
            y="目标函数",  # y 轴：目标函数值
            label=f"Number of gold miners: {int(pop_size)}",
            ci=None,
            linewidth=3,  # 设置折线宽度
            marker="^",
            markersize=8,
            color='#1f77b4',
            # alpha = 0.8,
        )

        # # 获取目标函数和置信区间数据
        # mean = subset.groupby('迭代')['目标函数'].mean()
        # print(subset.groupby('迭代')['目标函数'].std())
        # ci_upper = mean + subset.groupby('迭代')['目标函数'].std()
        # ci_lower = mean - subset.groupby('迭代')['目标函数'].std()
        #
        # # 使用fill_between来绘制置信区间的填充区域
        # plt.fill_between(mean.index, ci_lower, ci_upper, color="#1f77b4", alpha=0.2)

    # 设置图形标题和标签
    # plt.title("不同狮群数量下的目标函数变化", fontsize=16)
    plt.xlabel("Number of iterations", fontsize=16, fontname="SimHei", labelpad=10)
    plt.ylabel("objective function value", fontsize=16, fontname="SimHei", labelpad=15)

    plt.xticks(fontsize=14, fontname="Times New Roman")  # 确保刻度为整数
    plt.yticks(fontsize=14, fontname="Times New Roman")  # X轴刻度调整
    # 设置刻度线样式
    plt.tick_params(axis='both', which='both', length=6, width=1, colors='black')  # 设置刻度线的样式

    plt.xlim(10, 100)  # 将x轴范围从10到100

    plt.legend(loc='upper right',prop={'size': 14, "family": "SimHei"})
    plt.tight_layout()

    # 显示图形
    plt.show()

# import matplotlib.pyplot as plt
# import pandas as pd
# import seaborn as sns
#
# sns.set(style="white", font_scale=1.5)
# plt.rcParams['font.sans-serif'] = "Simsun"  # 支持中文字体
#
# # Excel文件路径
# excel_file = 'D:\文档\DLMU\GRO实验结果.xlsx'
#
# # 使用pandas读取Excel文件的 sheet5 和 sheet6 数据
# df5 = pd.read_excel(excel_file, sheet_name='Sheet5')
# df6 = pd.read_excel(excel_file, sheet_name='Sheet6')
#
# # 创建一个空的DataFrame，用于合并所有数据
# all_data = pd.DataFrame()
#
# # 处理Sheet5的数据
# if not df5.columns.isnull().all():
#     df5 = df5.dropna(how="all")  # 去除完全空的行
#     if "狮群" in df5.columns:
#         df5["Population Size"] = df5["狮群"].iloc[0]  # 使用第一个值作为种群大小
#     all_data = pd.concat([all_data, df5], ignore_index=True)
#
# # 处理Sheet6的数据
# if not df6.columns.isnull().all():
#     df6 = df6.dropna(how="all")  # 去除完全空的行
#     if "狮群" in df6.columns:
#         df6["Population Size"] = df6["狮群"].iloc[0]  # 使用第一个值作为种群大小
#     all_data = pd.concat([all_data, df6], ignore_index=True)
#
# # 获取唯一的种群大小列表
# population_sizes = all_data["Population Size"].unique()
#
# # 初始化绘图
# plt.figure(figsize=(12, 8))
#
# # 遍历每个种群大小并绘制到同一图上
# for pop_size in population_sizes:
#     subset = all_data[all_data["Population Size"] == pop_size]  # 按种群大小筛选数据
#     sns.lineplot(
#         data=subset,
#         x="迭代",  # x 轴：迭代次数
#         y="目标函数",  # y 轴：目标函数值
#         label=f"狮群数量: {int(pop_size)}",
#         ci=20,
#         linewidth=2,  # 设置折线宽度
#         marker="o",
#     )
#
# # 设置图形标题和标签
# plt.title("不同狮群数量下的目标函数变化", fontsize=16)
# plt.xlabel("迭代次数", fontsize=14)
# plt.ylabel("目标函数值", fontsize=14)
#
# plt.xlim(0, 100)  # 将x轴范围从0到100
#
# plt.legend(title="狮群数量", title_fontsize=12, fontsize=10, loc='upper right')
# plt.tight_layout()
#
# # 显示图形
# plt.show()

